package com.witframework.core.logic;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.springframework.transaction.annotation.Transactional;

import com.witframework.WitServiceException;
import com.witframework.core.persistence.PageSortModel;
/**
 * 未说明的功能类定义
 * @author wuxinyang
 *
 */

@Transactional public interface IBaseService{
	void init(Class entityClass);
	void init(Class entityClass,boolean isMem);
	/**
	 * 返回给实体类型已持久化的实体对象，根据给定的标识查找，如果未找到则返回null。	 *
	 * @param id - 持久化对象实例的标识
	 * @return 持久化对象实例, 如果未找到则返回null。
	 */
	Object get(String id) throws WitServiceException;
	Object get(Serializable id) throws WitServiceException;
	int getAllSize()throws WitServiceException ;
	/**
	 * 返回给实体类型的所有已持久化的实例。
	 * 实体类型由getPersistentClass（）指定的。
	 * @return List 包含0或多个持久化实例对象。
	 */
	List getAll() throws WitServiceException;

	/**
	 * 持久化给定的实体对象
	 * @param entity - 要持久化的实体对象
	 * @return 返回已持久化对象实例的标识
	 */
	String save(Object entity) throws WitServiceException;
	void saveAll(Collection entityCollection) throws WitServiceException;
	/**
	 * 更新给定的实体对象的持久化数据
	 * @param entity -  the persistent instance to update
	 */
	void update(Object entity) throws WitServiceException;
	/**
	 * 持久化给定的实体对象
	 * @param entity -  the persistent instance to update
	 */
	String saveOrUpdate(Object entity)throws WitServiceException;
	int saveOrUpdateAll(List entityList)throws WitServiceException;
	/**
	 * 删除实体对象的持久化数据，该实体数据是根据给定的标识查找到的。
	 * @param id - the identifier of the persistent instance
	 */

	void deleteById(final String id) throws WitServiceException;
	/**
	 * 删除单个实体对象的数据从持久化数据中
	 * @param o
	 */
	void delete(Object entity) throws WitServiceException;
	/**
	 * 删除实体对象的持久化数据,该实体数据是根据给定的属性和值查找到的。
	 * @param propertyName -属性名称
	 * @param value -属性的值
	 */
	void deleteBy(String propertyName,Object value) throws WitServiceException;
	/**
	 * 删除集合中的所有实体的持久化数据
	 * @param entities -包含实体对象的集合
	 */
	void deleteAll(Collection  entities) throws WitServiceException;
	/**
	 * 删除实体对象的持久化数据，该实体数据是根据给定的一个或多个(数组)标识查ID找到的。
	 * @param ids -ID,连续列出的多个ID值或包含ID值的数组
	 */
	void deleteAllByIds(String...ids) throws WitServiceException;
	/**
	 * 查找实体
	 * @param filter -数据过滤条件，键-值映射关系为实体的属性和值
	 * @return -包含实体对象的List 集合
	 * @see #findBy(String, Object)
	 */
	List  findBy(Map filter) throws WitServiceException;
	Object  findObjectBy(Map filter) throws WitServiceException;
	List findBy(Map filter,String orderby ,boolean isAsc)throws WitServiceException;
	/**
	 * 查找实体
	 * @param propertyName -属性名称
	 * @param value -属性的值
	 * @return -包含实体对象的List 集合
	 * @see #findBy(Map)
	 */
	List  findBy(String propertyName,Object value) throws WitServiceException;
	
	
	Object  getBy(String propertyName,Object value) throws WitServiceException;
	
	/**
	 * 执行分页数据查询
	 * @param filter 键-值映射关系为实体的属性和值
	 * @param psm -分页模型
	 * @return -包含实体对象的List 集合
	 *
	 */
	List  pagedQuery(Map filter, PageSortModel ps) throws WitServiceException;
	/**
	 * 复制对象的状态中持久化数据中。
	 * @param entity 当前实体对象
	 * @return 更新的持久化对象实例
	 */
	Object merge(Object entity) throws WitServiceException;

	/**
	 * 执行“命名”查询
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @return 包含实体对象的List 集合
	 */
	List findByNamedQuery(String queryName) throws WitServiceException ;
	/**
	 * 执行“命名”查询，绑定一个查询参数值到查询语句中的“？”
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param value ？参数值
	 * @return 包含实体对象的List 集合
	 */
	List findByNamedQuery(String queryName, Object value) throws WitServiceException ;
	/**
	 * 执行“命名”查询，绑定每个查询参数值到查询语句中的“？”
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param values ？参数值
	 * @return 包含实体对象的List 集合
	 */
	List findByNamedQuery(final String queryName, final Object[] values) throws WitServiceException ;
	/**
	 * 执行“命名”查询，绑定参数值到“:”形式命名的参数在查询语句中
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param paramName 参数名称
	 * @param value 参数值
	 * @return 包含实体对象的List 集合
	 */
	List findByNamedQueryAndNamedParam(String queryName, String paramName, Object value);
	/**
	 * 执行“命名”查询，绑定每个查询参数值到查询语句中的“：”命名参数
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param paramNames 参数名称
	 * @param values “：”命名参数的值
	 * @return 包含实体对象的List 集合
	 */
	List findByNamedQueryAndNamedParam(	final String queryName, final String[] paramNames, final Object[] values)throws WitServiceException;
	/**
	 * 执行“命名”查询，分页查询
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param psm -分页模型
	 * @return 包含实体对象的List 集合
	 */
	List pagedQueryByNamedQuery(String queryName,PageSortModel psm)throws WitServiceException ;
	/**
	 * 执行“命名”查询，绑定一个查询参数值到查询语句中的“？”，分页查询
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param value ？参数值
	 * @param psm -分页模型
	 * @return 包含实体对象的List 集合
	 */
	List pagedQueryByNamedQuery(String queryName, Object value,PageSortModel psm) throws WitServiceException;
	/**
	 * 执行“命名”查询，绑定每个查询参数值到查询语句中的“？”，分页查询
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param values ？参数值
	 * @param psm -分页模型
	 * @return 包含实体对象的List 集合
	 */
	List pagedQueryByNamedQuery(final String queryName, final Object[] values,PageSortModel psm) throws WitServiceException ;
	/**
	 * 执行“命名”查询，绑定参数值到“:”形式命名的参数在查询语句中，分页查询
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param paramName 参数名称
	 * @param value 参数值
	 * @param psm -分页模型
	 * @return 包含实体对象的List 集合
	 */
	List pagedQueryByNamedQueryAndNamedParam(String queryName,String paramName, Object value,PageSortModel psm);
	/**
	 * 执行“命名”查询，绑定每个查询参数值到查询语句中的“：”命名参数
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param paramNames 参数列表
	 * @param values “：”命名参数的值列表
	 * @param psm -分页模型
	 * @return 包含实体对象的List 集合
	 */
	List pagedQueryByNamedQueryAndNamedParam(String queryName,String[] paramNames, Object[] values,PageSortModel psm);

}
